import { ALIIMAGE } from '@/utils/configData/config'
import filter from '@/utils/fitters'
import OSS from 'ali-oss'
import lrz from 'lrz'

let client: any = null
const aliOss = {
  /**
   * 创建随机字符串
   * @param num
   * @returns {string}
   */
  randomString(num: Number) {
    const chars = [
      '0',
      '1',
      '2',
      '3',
      '4',
      '5',
      '6',
      '7',
      '8',
      '9',
      'a',
      'b',
      'c',
      'd',
      'e',
      'f',
      'g',
      'h',
      'i',
      'j',
      'k',
      'l',
      'm',
      'n',
      'o',
      'p',
      'q',
      'r',
      's',
      't',
      'u',
      'v',
      'w',
      'x',
      'y',
      'z'
    ]
    let res = ''
    for (let i = 0; i < num; i++) {
      const id = Math.ceil(Math.random() * 35)
      res += chars[id]
    }
    return res
  },

  /**
   * 创建oss客户端对象
   * @returns {*}
   */
  createOssClient() {
    return new Promise((resolve, reject) => {
      if (client) {
        return resolve(client)
      }
      client = new OSS({
        region: 'Your oss Region',
        accessKeyId: 'accessKeyId',
        accessKeySecret: 'accessKeySecret',
        bucket: 'Bucket Name'
      })
      resolve(client)
    })
  },

  /**
   * 图片上传
   * 参考csdn: https://blog.csdn.net/qq_27626333/article/details/81463139
   * @param option
   *   option.file 文件
   *   option.imageType 图片类型：nowater、official、panoram、forum、user，默认official
// <el-upload
// :http-request="httpRequestOrder"
// :on-success="onSuccessTitleimageMore"
// :show-file-list="false"
// name="activefile"
// style="display: inline-block"
// action
// multiple
// list-type="picture-card"
// >
// <el-button type="text">选择图片</el-button>
// </el-upload>

// 上传图片，同步上传
// async httpRequestOrder(option) {
//   option.imageType = 'nowater' // 无水印
//   option.quality = 1 // 不压缩
//   this._uploads = this._uploads || []
//   this._uploads.push({
//     fn: this.$oss.ossUploadImage,
//     option,
//   })
//   this.$tools.debounce(this.call, 100)()
// },
// async call() {
//   for (const a of this._uploads) {
//     await a.fn(a.option)
//   }
//   this._uploads = []
// },

// // 多种图片上传
// // 上传成功回调
// onSuccessTitleimageMore(response, file, fileList) {
//   if (!response) {
//     return
//   }
//   const me = this
//   const imgObj = {}
//   if (response.name) {
//     const imageindex = this.imageindex

//     imgObj.url = file.response.imgUrl.replace('nowater300', 'nowater600')
//     imgObj.name = file.uid
//     me.arrList[imageindex.index]['image' + imageindex.signPoint].push(imgObj)
//   } else {
//     me.$notify.error({
//       title: '上传错误',
//     });
//   }
// },
   */

  ossUploadImage(option: any) {
    // console.log(option);
    const self = aliOss
    const file = option.file
    option.onError = option.onError || function () {}
    option.onSuccess = option.onSuccess || function () {}
    option.onProgress = option.onProgress || function () {}
    console.log(file)
    if (file.type.indexOf('image') === -1) {
      return window.alert('请上传图片')
    }
    return new Promise((resolve, reject) => {
      const imageType = option.imageType || 'official' // 图片类型，默认official
      const quality = option.quality || 0.7 // 图片压缩比例，默认 0.7 车库平台使用时，使用0.8
      const date = filter.format(new Date(), 'YYYYMMDD') // 当前时间
      const dateTime = filter.format(new Date(), 'YYYYMMDDHHmmss') // 当前时间
      const randomStr = self.randomString(4) //  4位随机字符串
      const extensionName = file.name.substr(file.name.indexOf('.')) // 文件扩展名
      const fileName = imageType + '/' + date + '/' + dateTime + '_' + randomStr + extensionName // 文件名字（相对于根目录的路径 + 文件名）
      lrz(file, {
        quality: quality
      })
        .then(function (rst: { file: { size: number; name: any; type: any } }) {
          // console.log(rst)
          // 超出大小
          // console.log(rst.file.size / 1024);
          if (rst.file.size / 1024 > 10 * 1024) {
            reject('图片不能超过10M')
            return option.onError('图片不能超过10M')
          }

          // 设置文件名
          if (!rst.file.name) {
            rst.file.name = file.name
          }

          // 执行上传
          self.createOssClient().then((client) => {
            // console.log(client);
            // 上传处理
            client
              .multipartUpload(fileName, rst.file, {
                progress: function (p: number) {
                  const e = {}
                  e.percent = Math.floor(p * 100)
                  option.onProgress(e)
                },
                meta: { people: 'x-oss-meta-motor' },
                mime: rst.file.type
              })
              .then(
                (val: { res: { statusCode: number }; name: any }) => {
                  if (val.res.statusCode === 200) {
                    const url = `${ALIIMAGE}${val.name}`
                    self.loadImage({ url, val, file: rst.file, option, resolve, reject })
                  } else {
                    option.onError('上传失败')
                    reject('上传失败')
                    console.log('上传失败')
                  }
                },
                (err: { message: any }) => {
                  option.onError('上传异常')
                  reject(err.message)
                  console.log(err.message)
                }
              )
          })
        })
        .catch(function (e: any) {
          console.error(e)
        })
    })
  },

  loadImage({ url, val, file, option, resolve, reject }) {
    const img = new Image()
    img.src = url
    img.onload = function () {
      val.imgOrgUrl = `${url}?_${img.width}_${img.height}`
      val.imgUrl = url
      val.name = file.name
      val.fileName = file.name
      option.onSuccess(val)
      resolve(val)
    }
    img.onerror = function () {
      option.onError('图片加载失败')
      reject('图片加载失败')
    }
  },

  /**
   * 文件上传
   * @param option
// <el-form-item label="设备文件" prop="assignFile">
//   <el-upload
//     :show-file-list="false"
//     :http-request="httpRequest"
//     :on-success="updateFile"
//     accept=".txt"
//     name="upfile"
//     class="cover-uploader"
//     action
//   >
//     <el-button type="primary" class="fl-left">设备文件</el-button>
//     <span class="file-url fl-left">{{ fileName }}</span>
//   </el-upload>
// </el-form-item>

// // 上传文件
// async httpRequest(option) {
//   this.$oss.ossUploadFile(option)
// },
// updateFile(res) {
//   if (!res) return
//   console.log(res)
//   console.log(res.name)
//   if (res.name) {
//     console.log(res.url)
//     this.fileName = res.fileName
//     this.$set(this.ruleForm, 'assignFile', res.url)
//     return
//   } else {
//     this.$notify.error({
//       title: '上传错误'
//     })
//   }
// },

  */
  ossUploadFile(option: any) {
    // console.log(option);
    const self = aliOss
    const file = option.file
    return new Promise((resolve, reject) => {
      const date = filter.format(new Date(), 'YYYYMMDD') // 当前时间
      const dateTime = filter.format(new Date(), 'YYYYMMDDHHmmss') // 当前时间
      const randomStr = self.randomString(4) //  4位随机字符串
      const extensionName = file.name.substr(file.name.indexOf('.')) // 文件扩展名
      const fileType = extensionName === '.apk' ? 'apk' : 'file' // 文件类型，默认file
      const fileName = fileType + '/' + date + '/' + dateTime + '_' + randomStr + extensionName // 文件名字（相对于根目录的路径 + 文件名）

      // 执行上传
      self.createOssClient().then((client) => {
        // 上传处理
        client
          .multipartUpload(fileName, file, {
            progress: function (p) {
              const e = {}
              e.percent = Math.floor(p * 100)
              option.onProgress(e)
            },
            meta: { people: 'x-oss-meta-motor' },
            mime: file.type
          })
          .then(
            (val) => {
              if (val.res.statusCode === 200) {
                const url = `${ALIIMAGE}${val.name}`
                val.url = url
                val.fileName = file.name
                option.onSuccess(val)
                resolve(val)
              } else {
                option.onError('上传失败')
                reject('上传失败')
              }
            },
            (err) => {
              option.onError('上传异常')
              reject(err)
            }
          )
      })
    })
  }
}

export default aliOss
